﻿using System.Diagnostics.Contracts;

namespace MathService.TypeDesigners
{
    ///<summary>Интерфейс редактора объекта</summary>
    [ContractClass(typeof(ContractToITypeDesigner))]
    public interface ITypeDesigner
    {
        ///<summary>Редактировать объект</summary>
        ///<param name="Item">Редактируемый объект</param>
        void Edit(object Item);

        void Clear();
    }

    [ContractClassFor(typeof(ITypeDesigner))]
    abstract class ContractToITypeDesigner : ITypeDesigner
    {
        private ContractToITypeDesigner() { }

        #region Implementation of ITypeDesigner

        public void Edit(object Item) { Contract.Requires(Item != null); }

        public void Clear() { }

        #endregion
    }

    public interface ITypeDesigner<T>
    {
        ///<summary>Редактировать объект</summary>
        ///<param name="Item">Редактируемый объект</param>
        void Edit(T Item);

        void Clear();
    }
}
